package Interfaz;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractButton;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

import Atxy2k.CustomTextField.RestrictedTextField;
import LogicaDeNegocio.AdministracionFechas;
import LogicaDeNegocio.GestionDeLicencias;
import LogicaDeNegocio.GestionDeTitulares;
import LogicaDeNegocio.GestionSistema;
import Modelo.Entidades.Licencia;
import Modelo.Entidades.TipoDocumento;
import Modelo.Entidades.Titular;
import net.miginfocom.swing.MigLayout;

import javax.swing.JList;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;

import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

public class ImprimirLicencia extends JPanel {
	private GestionSistema admSistema = GestionSistema.getInstance();
	private AdministracionFechas admFechas = AdministracionFechas.getInstance();
	private GestionDeLicencias admLicencia = GestionDeLicencias.getInstance();
	private GestionDeTitulares admTitular = GestionDeTitulares.getInstance();
	private Menu menu;

	private JPanel panelSuperior;
	private JPanel panelCentral;
	private JPanel panelAux;
	private JPanel panelFrontal;
	private JPanel panelReverso;
	private JComboBox cbTipoDocumento;
	private JTextField textFieldNumeroDocumento;
	private RestrictedTextField restrictedNumeroDoc;
	private DefaultListModel modeloLista;
	private JList list;
	private JButton btnBuscar;
	private JButton reversoButton;
	
	private Licencia licencia;
	private Titular titular;
	private JButton imprimirButton;

	/**
	 * Create the panel.
	 */
	
	public ImprimirLicencia(){
		initialize(admSistema.getTipoDocumentos().get(0),"");
	}
	
	public ImprimirLicencia(TipoDocumento tipoDocumento, String numeroDocumento){
		initialize(tipoDocumento,numeroDocumento);
	}
	
	private void initialize(TipoDocumento tipoDocumento, String numeroDocumento) {
		setLayout(new BorderLayout());
		setBorder(new TitledBorder(new LineBorder(new Color(184, 207, 229)), "Imprimir Licencia", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		setPreferredSize(new Dimension(602,500));
		
		JPanel buttonPane = new JPanel();
		buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
		add(buttonPane,BorderLayout.SOUTH);
		
		reversoButton = new JButton("Ver Reverso");
		reversoButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if(reversoButton.getText().equals("Ver Reverso")){
					reversoButton.setText("Ver Frontal");
					
					panelCentral.remove(panelAux);
					panelAux = panelReverso;
					panelCentral.add(panelAux);
					menu.getInstance().setSize(new Dimension(602,601));
				}
				else{
					reversoButton.setText("Ver Reverso");
					
					panelCentral.remove(panelAux);
					panelAux = panelFrontal;
					panelCentral.add(panelAux);
					menu.getInstance().setSize(new Dimension(602,600));
				}
			}
		});
		reversoButton.setActionCommand("Reverso");
		reversoButton.setEnabled(false);
		buttonPane.add(reversoButton);
		
		imprimirButton = new JButton("Imprimir");
		imprimirButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				Document document = new Document();
				float ancho = panelFrontal.getWidth();
				float alto = panelFrontal.getHeight();
				try {
					PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("Archivos/Impresion.pdf"));
					document.open();
					PdfContentByte contentByte = writer.getDirectContent();
					//Impresion panel frontal
					PdfTemplate template = contentByte.createTemplate(ancho,alto);
					Graphics2D g2 = template.createGraphics(ancho,alto);
					panelFrontal.print(g2);
					
					g2.dispose();
					contentByte.addTemplate(template, 0, document.getPageSize().getHeight()-alto);
					
					//Impresion panel reverso
					PdfTemplate template1 = contentByte.createTemplate(ancho,alto);
					Graphics2D g21 = template1.createGraphics(ancho,alto);
					
					panelCentral.remove(panelAux);
					panelAux = panelReverso;
					panelCentral.add(panelAux);
					menu.getInstance().setSize(new Dimension(602,601));
					panelReverso.print(g21);		
					
					g21.dispose();
					contentByte.addTemplate(template1, 0, document.getPageSize().getHeight()-2*alto-30);
					
					//Impresion panel Reporte
					document.newPage();
					PdfTemplate template2 = contentByte.createTemplate(ancho,alto+30);
					Graphics2D g22 = template2.createGraphics(ancho,alto+30);
					
					panelCentral.remove(panelAux);
					panelAux = new Reporte(admFechas.getFechaToString(licencia.getFechaInicio()), licencia.getClaseLicencia().getDescripcion(),licencia.getTitular().getNombre()+" "+licencia.getTitular().getApellido(),"$ "+ String.valueOf(admLicencia.getCostoLicencia(licencia)));
					panelCentral.add(panelAux);
					menu.getInstance().setSize(new Dimension(603,601));
					Color color = panelAux.getBackground();
					panelAux.setBackground(Color.WHITE);
					panelAux.print(g22);				
					panelCentral.remove(panelAux);
					panelAux = panelFrontal;
					panelAux.setBackground(color);
					panelCentral.add(panelAux);
					menu.getInstance().setSize(new Dimension(602,600));
					
					g22.dispose();
					contentByte.addTemplate(template2, 0, document.getPageSize().getHeight()-alto);
					
					File objetofile = new File ("Archivos/Impresion.pdf");
		            Desktop.getDesktop().open(objetofile);
				} catch (Exception e) {
					e.printStackTrace();
				}
				finally{
					if(document.isOpen()){
						document.close();
					}
				}
			}
		});
		imprimirButton.setActionCommand("Imprimir");
		imprimirButton.setEnabled(false);
		buttonPane.add(imprimirButton);
		
		panelSuperior = new JPanel();
		panelSuperior.setLayout(new MigLayout("", "[][][][grow][]", "[][]"));
		this.add(panelSuperior,BorderLayout.NORTH);
		
		JLabel lblTipoDocumento = new JLabel("Tipo documento");
		panelSuperior.add(lblTipoDocumento, "cell 0 0,alignx trailing");
		
		cbTipoDocumento = new JComboBox();
		panelSuperior.add(cbTipoDocumento, "cell 1 0,growx");
		cbTipoDocumento.setModel(new DefaultComboBoxModel(admSistema.getTipoDocumentos()));
		cbTipoDocumento.setSelectedItem(tipoDocumento);
		
		JScrollPane scrollPane = new JScrollPane();
		panelSuperior.add(scrollPane, "cell 3 0 2 2,growx");
		
		list = new JList();
		list.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(list.getSelectedIndex()!=-1){
					reversoButton.setText("Ver Reverso");
					
					reversoButton.setEnabled(true);
					imprimirButton.setEnabled(true);
					licencia = (Licencia) list.getSelectedValue();
					
					String donante = licencia.isDonanteOrganos() ? "Si":"No";
					
					panelCentral.remove(panelAux);
					panelFrontal = new VistaFrontal(licencia.getTitular().getDireccion(), licencia.getTitular().getApellido(), licencia.getTitular().getNombre(), String.valueOf(licencia.getIdLicencia()), admFechas.getFechaToString(licencia.getFechaVencimiento()), licencia.getClaseLicencia().toString(), licencia.getObservaciones());
					panelReverso = new VistaReverso(admFechas.getFechaToString(licencia.getTitular().getFechaNacimiento()),licencia.getTitular().getTipoDocumento().toString()+licencia.getTitular().getNroDocumento(), donante,licencia.getTitular().getGrupoSanguineo().getFactor()+" "+ licencia.getTitular().getGrupoSanguineo().getNombregrupo(), admFechas.getFechaToString(licencia.getFechaInicio()));
					panelAux = panelFrontal;
					panelCentral.add(panelAux,BorderLayout.CENTER);
					menu.getInstance().setSize(new Dimension(600,602));
				}
			}
		});
		scrollPane.setViewportView(list);
		
		modeloLista = new DefaultListModel();
		list.setModel(modeloLista);
		
		JLabel lblNumeroDocumento = new JLabel("Numero documento");
		panelSuperior.add(lblNumeroDocumento, "cell 0 1,alignx trailing");
		
		textFieldNumeroDocumento = new JTextField(numeroDocumento);
		panelSuperior.add(textFieldNumeroDocumento, "cell 1 1,growx");
		textFieldNumeroDocumento.setColumns(10);
		
		restrictedNumeroDoc = new RestrictedTextField(textFieldNumeroDocumento);
		restrictedNumeroDoc.setLimit(8);
		restrictedNumeroDoc.setOnlyNums(true);
		
		btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				TipoDocumento tipoDoc = (TipoDocumento) cbTipoDocumento.getSelectedItem();
				String numeroDocumento = textFieldNumeroDocumento.getText();
				
				modeloLista.removeAllElements();
				
				try {
					titular = admTitular.getTitular(tipoDoc,numeroDocumento);
					List<Licencia> licencias = admLicencia.getVigentes(titular);
					for(Licencia l : licencias){
						modeloLista.addElement(l);
					}
				} catch (Throwable e) {
					new ErrorEstandar("No se encontro el Titular, con Tipo Documento " + tipoDoc + ":" + numeroDocumento +
							". \nDebe darlo de Alta");
				}
				
			}
		});
		panelSuperior.add(btnBuscar, "cell 2 1");
		
		panelCentral = new JPanel();
		panelCentral.setLayout(new BorderLayout());
		panelCentral.setBorder(new TitledBorder(new LineBorder(new Color(184, 207, 229)), "Vista preliminar", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		this.add(panelCentral,BorderLayout.CENTER);
		
		panelAux = new JPanel();
		panelCentral.add(panelAux,BorderLayout.CENTER);
		
	}
}
